實作一個小時鐘。
rotate
有沒有時鐘轉動的效果取得所有指針
const Hour = document.querySelector('.hour-hand');
const Min = document.querySelector('.min-hand');
const Second = document.querySelector('.second-hand');
取得現在時間: new Date()
const time = new Date();
時間計算:
一個圓等於 360 度,再去計算對應的值
const currenHour = time.getHours() * 30 + time.getMinutes() * 30 / 60; // (360/12)
const currenMinute = time.getMinutes() * 6 + time.getSeconds() * 6 / 60; // (360/60)
const currenSecond = time.getSeconds() * 6;
改變指針位置: dom.style.transform = rotate(${currenHour}deg);
Hour.style.transform = `rotate(${currenHour}deg)`;
Min.style.transform = `rotate(${currenMinute}deg)`;
Second.style.transform = `rotate(${currenSecond}deg)`;
把 1 ~ 4 用一個 function
包起來,方便調用
function setClock() {
}
setClock();
計時器更新畫面: 可使用 setInterval
每秒執行一次。
function animationHandler() {
setClock();
window.requestAnimationFrame(animationHandler);
}
window.requestAnimationFrame(animationHandler); // 處理畫面上的 setTimeout
計時器
setInterval
:MDN,設定一次,之後持續間隔多久執行一次。
setInterval(setClock, 1000); // 每秒呼叫一次
setTimeout
:MDN,設定一次,之後延遲多久在執行一次,如果要持續執行需要在裡面在呼叫自己。
setTimeout
進行循環調用時,會因為每次都要等前一次執行完畢才設置下一次,可能會造成延遲累積。function timeoutHandler() {
setClock();
setTimeout(timeoutHandler, 1000);
}
setTimeout(timeoutHandler, 1000);
requestAnumationFrame
:MDN,刷新頻率跟隨電腦硬體本身。使用方法與setTimeout
類似,是處理畫面上的setTimeout
。
requestAnimationFrame
會自動暫停在非活動標籤頁中,節省資源。